import { getSongDetail, getLyric } from 'network/player';
import { getRandomNumber } from 'utils/math-utils';
// import { parseLyric } from 'utils/parse-lyric';

import * as actionTypes from './constants';

const changeCurrentSongAction = (currentSong)=>({
    type:actionTypes.CHANGE_CURRENT_SONG,
    currentSong
})
// 这是改变当前的音乐列表
const changePlayListAction = (playList) => ({
  type: actionTypes.CHANGE_PLAY_LIST,
  playList
});

// 这是改变当前的音乐第几个
const changeCurrentSongIndexAction = (index) => ({
  type: actionTypes.CHANGE_CURRENT_SONG_INDEX,
  index
});

// 对外暴露的action
// 这个 方法 是会暴露出去的 
export const changeSequenceAction = (sequence) => ({
  type: actionTypes.CHANGE_SEQUENCE,
  sequence
});

// 原本 这样的 一个方法里是拿不到 dispatch 
// 但是  因为他暴露出去了 暴露给一个有dispatch的位置 然后执行这个方法 
// 在有dispath 的地方执行这个方法 然后把dispatch 当参数传进来
// 然后在这个位置 开始执行 业务逻辑了 

export const changeCurrentSong = (tag)=>{
  return (dispatch,getState) =>{
    const playList = getState.player.get("playList")
    const sequence = getState.player.get('sequence');
    let currentSongIndex = getState().player.get('currentSongIndex');
    switch(sequence){
      case 1:  // 随机播放
       let rendomIndex =  getRandomNumber(playList.length);
       while (currentSongIndex === rendomIndex ){
        rendomIndex =  getRandomNumber(playList.length);
       }
       currentSongIndex = rendomIndex;
       break;

      default: //顺序播放  
        currentSongIndex +=tag;
        if(currentSongIndex >=playList.length) currentSongIndex= 0;
        if(currentSongIndex < 0) currentSongIndex= playList.length - 1;
    }
  }
}

// 这里是用户去请求歌曲数据
// export const getSongDetailAction = (ids)=>{
  export const getSongDetailAction = (ids) => {
    return (dispatch, getState) => {
      // 1.根据id查找playList中是否已经有了该歌曲
      const playList = getState().player.set("playList");
      // 这就是找 在song的id里找等于ids的 如果找到了 就把ids 返回给songIndex
      // 如果没找到就返回-1
      const songIndex = playList.findIndex(song => song.id === ids);
  
      // 2.判断是否找到歌曲
      let song = null;
      if (songIndex !== -1) { // 查找歌曲
        dispatch(changeCurrentSongIndexAction(songIndex));//在redux里修改这个歌曲的当前值（下标）
        song = playList[songIndex];//修改播放的歌曲
        dispatch(changeCurrentSongAction(song));//在redux里修改 当前要播放的歌曲
        // dispatch(getLyricAction(song.id));
      } else { // 没有找到歌曲
        // 请求歌曲数据
        getSongDetail(ids).then(res => {
          song = res.songs && res.songs[0];
          if (!song) return;
  
          // 1.将最新请求到的歌曲添加到播放列表中
          // react的数据修改里 禁忌直接修改数据 要想修改 第一步一定是个浅copy
          // 然后修改 copy 过来的数据 最后用set给数据赋值 copy的加修改后的数据
          const newPlayList = [...playList];
          newPlayList.push(song);
  
          // 2.更新redux中的值
          dispatch(changePlayListAction(newPlayList));
          dispatch(changeCurrentSongIndexAction(newPlayList.length - 1));
          dispatch(changeCurrentSongAction(song));
  
          // 3.请求歌词
          // dispatch(getLyricAction(song.id));
        })
      }
    }
  }

  export const getLyricAction = (id) => {
    return dispatch => {
      getLyric(id).then(res => {
        const lyric = res.lrc.lyric;
        const lyricList = parseLyric(lyric);
        dispatch(changLyricListAction(lyricList));
      })
    }
  }